#include <stdio.h>
#include <string.h>
#include <ncurses.h>  
#include <unistd.h>  

// 进度条宽度定义
#define PROGRESS_BAR_WIDTH 30  
// 边框内边距
#define BORDER_PADDING 2  
// 带边框的窗口总宽度（进度条宽度 + 两边距*2 + 边框线2）
#define WINDOW_WIDTH (PROGRESS_BAR_WIDTH + 2 * BORDER_PADDING + 2)  
// 窗口高度
#define WINDOW_HEIGHT 5  
// 每次每次增加的进度值
#define PROGRESS_INCREMENT 3  
// 刷新延迟（微秒，300毫秒）
#define DELAY 300000  

int main() {  
    // 初始化ncurses
    initscr();  
    start_color();  // 启用颜色支持
    // 定义颜色对：1-绿色前景黑背景（已完成），2-红色前景黑背景（剩余）
    init_pair(1, COLOR_GREEN, COLOR_BLACK);  
    init_pair(2, COLOR_RED, COLOR_BLACK);  
    
    // 终端设置：不缓冲输入、不回显输入、隐藏光标
    cbreak();  
    noecho();  
    curs_set(FALSE);  

    // 获取终端尺寸并计算窗口起始位置（居中显示）
    int max_y, max_x;  
    getmaxyx(stdscr, max_y, max_x);  
    int start_y = (max_y - WINDOW_HEIGHT) / 2;  
    int start_x = (max_x - WINDOW_WIDTH) / 2;  

    // 创建新窗口并绘制边框
    WINDOW *win = newwin(WINDOW_HEIGHT, WINDOW_WIDTH, start_y, start_x);  
    box(win, 0, 0);  // 绘制边框
    wrefresh(win);  

    // 进度条控制变量
    int progress = 0;  
    int max_progress = PROGRESS_BAR_WIDTH;  

    // 进度更新循环
    while (progress <= max_progress) {  
        werase(win);  // 清除窗口内容
        box(win, 0, 0);  // 重绘边框（因为清除内容会覆盖边框）

        // 计算已完成和剩余进度长度
        int completed = progress;  
        int remaining = max_progress - progress;  

        // 进度条在窗口中的位置（考虑内边距）
        int bar_x = BORDER_PADDING + 1;  
        int bar_y = 1;  

        // 绘制已完成部分（绿色）
        wattron(win, COLOR_PAIR(1));  // 使用窗口级属性设置
        for (int i = 0; i < completed; i++) {  
            mvwprintw(win, bar_y, bar_x + i, "#");  
        }  
        wattroff(win, COLOR_PAIR(1));  

        // 绘制剩余部分（红色）
        wattron(win, A_BOLD | COLOR_PAIR(2));  
        for (int i = completed; i < max_progress; i++) {  
            mvwprintw(win, bar_y, bar_x + i, " ");  // 用空格填充剩余部分
        }  
        wattroff(win, A_BOLD | COLOR_PAIR(2));  

        // 显示百分比（居中）
        char percent_str[10];  
        snprintf(percent_str, sizeof(percent_str), "%d%%", 
                (progress * 100) / max_progress);  
        int percent_x = (WINDOW_WIDTH - strlen(percent_str)) / 2;  
        mvwprintw(win, WINDOW_HEIGHT - 2, percent_x, percent_str);  // 调整Y坐标避免贴边

        // 刷新窗口显示
        wrefresh(win);  

        // 更新进度并延迟
        progress += PROGRESS_INCREMENT;  
        usleep(DELAY);  
    }  

    // 清理资源并退出
    delwin(win);  
    endwin();  
    return 0;  
}